package br.unicamp.ic.sgct.client.apresentacao.ucs;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.gwtiger.client.screen.BaseScreen;
import org.gwtiger.client.widget.HoverGridWidget;
import org.gwtiger.client.widget.field.PasswordFieldWidget;
import org.gwtiger.client.widget.field.TextFieldWidget;

import br.unicamp.ic.sgct.client.InternacionalizacaoMessages;
import br.unicamp.ic.sgct.client.aplicacao.ucs.cancelamento.CancelamentoListener;
import br.unicamp.ic.sgct.client.apresentacao.widgets.ButtonCampoForm;
import br.unicamp.ic.sgct.client.apresentacao.widgets.MensagemUI;
import br.unicamp.ic.sgct.client.dominio.exception.InfraException;
import br.unicamp.ic.sgct.client.dominio.to.InscricaoTO;
import br.unicamp.ic.sgct.client.dominio.to.PessoaTO;
import br.unicamp.ic.sgct.client.dominio.to.SessaoTO;
import br.unicamp.ic.sgct.client.dominio.to.UsuarioTO;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.HTMLTable.RowFormatter;

/**
 * Classe alterada
 */
public class CancelamentoScreen extends BaseScreen {

	static InternacionalizacaoMessages msgs = GWT
			.create(InternacionalizacaoMessages.class);

	private final String MSG_REQUIRED_ERR = msgs.msgRequiredErr();

	private UsuarioTO usuario = null;

	// INICIO - Exercicio 5
	private List<InscricaoTO> inscricoes;
	long idUsuario;
	private VerticalPanel panelGeral = new VerticalPanel();
	private VerticalPanel gridInscricoes = new VerticalPanel();
	private DateTimeFormat _dtTimeFormat = DateTimeFormat
			.getFormat("dd/MM/yyy");
	private List<CheckBox> checkInscricoes = new ArrayList<CheckBox>();
	private HashMap<CheckBox, InscricaoTO> mapInscricoes = new HashMap<CheckBox, InscricaoTO>();
	private List<InscricaoTO> inscricoesCanceladas = null;
	// FIM - Exercicio 5

	private CancelamentoListener controladora;

	private FlexTable tblUsuario = new FlexTable();

	// dados usuario
	private TextFieldWidget txtbEmail = null;
	private PasswordFieldWidget txtbSenha = null;

	/**
	 * 
	 * @param usuario
	 * @param controladora
	 */
	public CancelamentoScreen(UsuarioTO usuario,
			final CancelamentoListener controladora) {
		super();
		this.controladora = controladora;
		this.controladora.setBaseScreen(this);

		this.usuario = usuario;

		panelGeral.setWidth("100%");
		panelGeral.setSpacing(10);
		panelGeral.add(controladora.getMensagemWidget());

		txtbEmail = new TextFieldWidget(msgs.email());
		txtbEmail.setRequired(true);
		tblUsuario.setWidget(0, 0, txtbEmail);

		txtbSenha = new PasswordFieldWidget(msgs.senha());
		txtbSenha.setRequired(true);
		tblUsuario.setWidget(1, 0, txtbSenha);

		tblUsuario.setCellSpacing(05);
		tblUsuario.setCellPadding(05);

		ButtonCampoForm btnConfirmar = new ButtonCampoForm("<i>"
				+ msgs.confirmarCancelamento() + "</i>");
		ButtonCampoForm btnLimpar = new ButtonCampoForm("<i>"
				+ msgs.limparDados() + "</i>");

		HorizontalPanel panelBtn = new HorizontalPanel();
		panelBtn.add(btnConfirmar);
		panelBtn.add(btnLimpar);
		panelBtn.setSpacing(6);

		panelGeral.add(tblUsuario);
		
		panelGeral.add(gridInscricoes);

		panelGeral.add(panelBtn);

		panelGeral.setCellWidth(panelBtn, "100%");

		String width = String.valueOf(panelGeral.getOffsetWidth() + 5);
		String height = String.valueOf(panelGeral.getOffsetHeight() + 5);

		
		// Acao cancelar
		btnConfirmar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				listarInscricoesUsuario();
			}
		});

		btnLimpar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				txtbSenha.clear();
				txtbEmail.clear();
				inscricoes = null;
				gridInscricoes.clear();
				if (controladora.getMensagemWidget() instanceof MensagemUI) {
					controladora.getMensagemWidget().setMensagemSucesso("");
					controladora.getMensagemWidget().setMensagemErro("");
					controladora.getMensagemWidget().setVisible(false);
				}
			}
		});

		this.initWidget(panelGeral);

	}

	/**
	 * Exercicio 5 - A
	 * 
	 * @return
	 */
	private void listarInscricoesUsuario() {
		if (!txtbEmail.validate() && txtbSenha.validate()) {
			this.controladora.getMensagemWidget().setMensagemErro(
					MSG_REQUIRED_ERR);
		} else {
			this.usuario.setEmail(txtbEmail.getText());
			this.usuario.setSenha(txtbSenha.getText());

			try {
				if (this.inscricoes != null && !this.inscricoes.isEmpty()) {
					boolean valid = false;
					InscricaoTO inscricaoEscolhida;
					this.inscricoesCanceladas = new ArrayList<InscricaoTO>();
					for (CheckBox inscricao : checkInscricoes) {
						
						if (inscricao.isChecked()) {
							inscricaoEscolhida = new InscricaoTO();
							inscricaoEscolhida = mapInscricoes.get(inscricao);
							inscricaoEscolhida.getUsuario().setEmail(txtbEmail.getText());
							inscricaoEscolhida.getUsuario().setSenha(txtbSenha.getText());
							this.inscricoesCanceladas.add(inscricaoEscolhida);
							
							valid = true;
						}
					}
					if (valid == false) {
						this.controladora.getMensagemWidget().setMensagemErro(msgs.selecioneUmaSessao());			
					} else {
						this.gridInscricoes.clear();
						this.inscricoes = null;
						this.controladora.cancelar(this.inscricoesCanceladas, this.usuario);
						
					}
				} else {
					this.controladora.listarInscricoes(this.usuario);
				}
			} catch (InfraException e) {
				this.controladora.setMensagemErro(e.getMessage());
				e.printStackTrace();
			} catch (Exception e) {
				this.controladora.setMensagemErro(e.getMessage());
				e.printStackTrace();
			}

		}
	}

	public void setInscricoes(List<InscricaoTO> inscricoes) {
		this.inscricoes = inscricoes;
		montarGridInscricoes();
	}

	private void montarGridInscricoes() {
		// adequa estado da UI
 		this.gridInscricoes.clear();
		this.controladora.getMensagemWidget().limparMensagem();

		if (this.inscricoes != null && !this.inscricoes.isEmpty()) {

			this.checkInscricoes.clear();
			for (InscricaoTO inscricaoTO : this.inscricoes) {
				CheckBox atual = new CheckBox(msgs.inscricaoCancelamento() 
						+ inscricaoTO.getIdInscricao() + msgs.dataInscricaoCancelamento()
						+ this._dtTimeFormat.format(inscricaoTO.getDataInscricao())
						+ msgs.sessaoCancelamento() + inscricaoTO.getSessao().getTema());
				this.checkInscricoes.add(atual);
				this.mapInscricoes.put(atual, inscricaoTO);
				this.gridInscricoes.add(atual);
			}
		} else {
			this.controladora
					.setMensagemErro(msgs.naoHaConferenciasAgendadas());
		}
	}

	// FIM Exercicio 5 e 5 - A
}